package Model;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A Server has a BlockingQueue of Tasks, in order to process them in a FIFO
* manner
*
* @author Dariana Lupea
*
*/
public class Server implements Runnable {
private final static Logger LOGGER = Logger.getLogger(Server.class.getName());
private BlockingQueue<Task> tasksQueue;
private int simulationTime;
private int currentTime;
private int serverCode;
private int totalServiceTime;
private int totalWaitingTime;
private int numberOfTasks;
public Server(int simulationTime, int serverCode) {
this.serverCode = serverCode;
tasksQueue = new LinkedBlockingQueue<Task>();
this.simulationTime = simulationTime;
this.currentTime = 0;
numberOfTasks = 1;
}
/* Returns the queue of the current server */
public BlockingQueue<Task> getTasksQueue() {
return tasksQueue;
}
/* Sets a certain queue to a Server */
public void setTasksQueue(BlockingQueue<Task> tasksQueue) {
this.tasksQueue = tasksQueue;
}
/* Returns the number of tasks from a Server */
public int getNumberOfTasks() {
return tasksQueue.size();
}
/* Check is a server has no tasks */
public boolean isEmtpyServer() {
return tasksQueue.isEmpty();
}
public void addTaskToServer(Task t, int serviceTime) {
try {
t.setServiceTime(t.getServiceTime() + serviceTime);
tasksQueue.put(t);
numberOfTasks++;
LOGGER.info("Task added to server...");
for (Task currTask : tasksQueue) {
LOGGER.info(currTask + "at the server: " + serverCode);
}
} catch (InterruptedException e) {
e.printStackTrace();
LOGGER.warning("Task cannot be added to server...");
}
}
@Override
public void run() {
while (currentTime <= simulationTime) {
for (Task taskInQueue : tasksQueue) {
//
if (taskInQueue.getServiceTime() == currentTime) {
taskInQueue.setFinishTime(currentTime);
taskInQueue.setWaitingTime();
totalWaitingTime += taskInQueue.getWaitingTime() ;
numberOfTasks++;
totalServiceTime += taskInQueue.getServiceTime() ;
try {
tasksQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
LOGGER.setLevel(Level.WARNING);
LOGGER.warning("Task cannot be added to server...");
}
}
}
for (Task taskInQueue : tasksQueue) {
LOGGER.info(taskInQueue + "at the server: " + serverCode);
System.out.println("Server-" +serverCode +" <--- " + taskInQueue.prettyPrint() );
}
try {
Thread.sleep(2000);// milisecunde
} catch (InterruptedException e) {
e.printStackTrace();
}
currentTime++;
}
}
public double getAverageWaitingTime() {
return (totalWaitingTime / numberOfTasks);
}
public double getAverageServiceTime() {
return (totalServiceTime / numberOfTasks);
}
}